#include<graphics.h>
#include<Window.h>
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
using namespace std;
int food[2];//记录事物的位置
# define wall_max_length;//定义围墙最大宽度
char wall[max_wall_length][max_wall_length];//墙
int game_over;// 判断输赢的变量
int game_time = 0;//第几关游戏
char gotoSecond; //判断是否要进行第二局的变量

//****************************定义小蛇***************************************
class Snake //（编程的时候需要和下面的函数具体的整理）
{
public:
	int len;
	int score;
//   int speed; 我觉得可以不要
	int** Snake_position;  //蛇的位置

	    Snake_Init(); //初始化蛇
	   Snake_length();
		Snake_Move();
		Snake_print();
};
//小蛇长度的建立,定义一个二维数组存储小蛇每一节x,y坐标
int**Snake_length()
{
	Snake_position = new int*[len];
	for (int i = 0; i < len; i++)
	{
		Snake_position[i] = new int[2];
	}
	 Snake_position;
}
//小蛇的移动
void Snake::Snake_Move( int **Snake_position,)
{
	//清空蛇尾
		gotoXY("蛇尾坐标")
		cout << " ";
//若没有输入。
//可能有错误
		if (!kbhit())
		{
			//优化了一下移动
				Snake_position[0][1] = Snake_position[0][1] + Snake_position[0][1] - Snake_position[1][1];
				Snake_position[0][0] = Snake_position[0][0] + Snake_position[0][0] - Snake_position[1][0];
			//其余方向同理
		}
//若有输入
	if(kbhit())
	{
		ch = getchar();
		switch (ch)
		{
		case 'up符号的ASC码':
		{
			//头部上移，这部分可能有错误，麻烦大佬们了
			snake_position[0][1]++;
			break;
		}
		其余几个方向同理;
		default:
			break;
		}
	}
	//移动后每一个坐标变为它前一个格子的坐标
    for (int i = 1; i < len; i++)
	{
			Snake_position[i][1] = Snake_position[i - 1][1];
			Snake_position[i][0] = Snake_position[i - 1][0];
	}
	//打印蛇头
	gotoXY("蛇头的位置");
	cout << "蛇头" << endl;
}
void Snake::Snake_print()
{
	//找到蛇头
	gotoXY(Snake_position[0][0], Snake_position[0][1]);
	cout << "蛇头" << endl;
	//打印身体
	for (i = 1; i < Snake.lenth - 1; i++)
	{
		gotoXY(Snake_position[i][0], Snake_position[i][1]);
		cout << "蛇身" << endl;
	}
	//打印蛇尾
	gotoXY(Snake_position[snake.length - 1][0], Snake_position[snake.length - 1][1]);
	cout << "蛇尾" << endl;
}
void Snake::Snake_Init( )
{
	score = 0;
	len = "小蛇长度";
	speed = "小蛇初始速度";
	//初始化小蛇坐标，懒得写了
	Snake_position[i][j] = "小蛇初始位置";

}
/*****************************游戏初始化************************/ 
//确定输出的位置

class Game_Model
{
public:
	int** obstacle； //障碍物
	void gotoXY(int x, int y);//位置函数
	void Map_Build();          //建立地图
	void Food_position();//产生食物坐标
	void Game_Init();  //游戏初始化
	void Game_over_judge();//胜负判断
	void Game_food_eating(); //判断是否吃到好吃的
	void Ending_Game();   //游戏结束页面
	void Second_Game();  //第二轮游戏
	void obstacle();  //设置障碍物

};

//如果大佬们觉得麻烦的话可以直接把这个函数去掉，确定障碍物坐标，反正我们只有两关
void obstacle()
{
	obstacle = new int* [game_time];
	if game_time > 0
		for (i = 0; i < game_time; i++)
		{
			obstacle[i] = new int[2];
		}
		for (i = 0; i < game_time; i++)
		{
		srand((unsigned)time(NULL));//随机数不重复(具体用法不太清楚）
		obstacle[i][0] = random.x;//获得障碍物坐标
		obstacle[i][1] = random.y;
		gotoXY(obstacle[i][0],onstacle[i][1]);
		cout << "障碍物模样";
		 }
		;

}

void gotoXY(int x, int y)
{
	COORD adress;
	HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	adress.Y = y;
	adress.X = x;
	SetConsoleCursorPosition(hOutput，adress);
}


void Food_position()
{
	srand((unsigned)time(NULL));//随机数不重复(具体用法不太清楚）
	food[0] = random.x; //随机的x坐标
	food[1] = random.y; //随机的y坐标
}
/*
	void Set_Color(int)
	{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),int);
	可以改变颜色。看心情使用
	 }*/
void Map_Build()
{
		//初始化围墙
	int i, j;
	wall[max_wall_length][max_wall_length] = { {0} };
	//利用for循环建立围墙（这里注意换行）
	   //具体循环i,j的数值大佬们改一下吧，我就大概写一下
    for (i = 0,j=0;i < max_wall_length;i++)
	{
		wall[i][j] = 1     
	//同理建立 i = 0, j从1到max_wall_length的围墙;，i = N-1……大佬们可有按照自己的喜好设置小巷等
	//可以把wall[i][j]设置为自己喜欢的图形
	}
	
	//打印边框
	gotoXY(框角位置);
	cout << "框角形状";
	//打印菜单
	gotoXY("相应菜单栏位置")
		cout << "对应菜单条目" << endl; //如  请按ESC退出；按上下左右改变位置；按**加速等；该处也可以写游戏规则
	//打印边框(可以看心情做）
	for (int j = 0,i = 0; j < max_wall_length; j++)
	{
		边框.打印;
	}
	//打印障碍物
	obstacle();
}



void Game_init()
{
	Snake mySnake;
	//初始化页面的程序可以插入
	Map_build();
	//页面设置
	gotXY(x,y);//可以确定输出的东西的位置
	Set_Color(int)
	cout<<"输出欢迎语"<<endl; 看心情制作，可以结合界面设置制作；得分、结果等函数可以这样制作*/
	//食物的随机出现
	Food_position();
	gotoXY(fooe[0], food[1]);
	cout << "食物的模样" << endl;

	
	//初始化小蛇
	//获取小蛇位置数组
	int** Snake_position = Snake_length(snake.len);
	Snake_init(mySnake, Snake_position);
	Snake_print();
	}
//****************************游戏条件设置***************************************
//判断是否撞墙或撞到自己
void Game_over_judge()
{
	//这个可以大佬们看心情写
	if (!(ch == 72 || ch == 80 || ch == 75 || ch == 77))
	{
		Ending_Game();
	}
	//碰壁或碰到障碍物游戏结束
	else if (Snake_position == wall.position||Snake_position == obstacle[i][j]) //具体代码就看大佬们了！
	{
		Ending_Game();
	}
	//蛇头碰到蛇身
	else if (Snake_position[0][0] == Snake_position[i][0] && Snake_position[0][1] == Snake_position[i][1])
	{
		Ending_Game();
	}
}

//判断是否吃到好吃的
void Game_eating_food()
{

	if (Snake_position[0][0] == food[0] && Snake_position[0][1] == food[1])  //蛇头碰到了食物
	{
		//C++好像没有realloc函数，所以我拷贝了数组。大佬们这里改进一下吧（孩子这块内容学的可差了（Q A Q）)
		int** Snake_copy = new int* [Snake.len];
		for (int i = 0; i < Snake.len; i++)
		{
			Snake_position[i] = new int[2];
		}
		Snake_copy[i][j] = Snake_position[i][j];
		Snake.len++; //吃米，长度加一
		Snake.Score++;//分数加一
		Snake.Snake_length();//更新蛇的长度
		//拷贝原来坐标
		for (each i, j except the head)
		{
			Snake_position[i][j] = Snake_copy[i - 1][j];
		}
		//判断方向添加蛇头坐标
		Snake_position[0][0] = Snake_position[1][0] * 2 - Snake_position[2][0];
		//蛇的纵坐标同理
		Snake_print();//打印新的蛇
        delete Snake_copy;//删除
		Food_position();   //食物重新产生一个
	}
		}
	
//**********************************************结束页面******************************************
void Ending_Game()
{
	//界面设置不如大佬们自由发挥
	gotoXY(xlabel, ylabel);
	cout << "your score" << endl;
	sleep(stop_time);
	if score >= standard //大于胜利标准
	{
		MessageBox(0, "You pass the game", "贪吃蛇", 1);//或者大佬可以做到直接把分数等信息都显示在弹窗里
		//是否进行第二局游戏
	    cout << "游戏结束，是否进行下一局游戏？（请输入A,B)" << endl;
		cout << "A. 继续游戏" << endl;
		cout << "B. 我不干了（- … -）" << endl;
		gotoSecond = cin.get();
		if gotoSecond == 'A'
			game_time++;
			Second_game_init();
		else if gotoSecond == 'B'
			cout << "阿这";	
			system("cls");
			cout << "游戏结束！(0 * 0)");
			cout
				sleep(2000);
			break;
	}
	else if score < standard
		MessageBox(0,"You lose the game","贪吃蛇",1);
	    system("cls");
	    cout << "游戏结束！(0 * 0)");
	    cout
	    sleep(2000);
	     break;
}

//************************************第二局游戏初始化*****************************************
void second_game_init()
{
	//清空页面
	system("cls");
	Snake mySnake;
	//初始化页面的程序可以插入
	Map_build();
	//食物的随机出现
		Food_position();
	gotoXY(fooe[0], food[1]);
	cout << "食物的模样" << endl;

}

//***********************************主函数********************************************
int main()
{
	//初始化游戏
	Game_init();
	while (1)
	{
		//蛇开始移动
		Snake_Move();
		Snake_print();
		//判断是否撞墙和撞到自己
		Game_over_judge();
		//判断是否吃事物
		Game_eating_food();
		//设置更新时间
		renew_time = 1000 - 10 * Snake.len;//renew_time 是一个关于长度的减函数
		Sleep(renew_time);
	}
	return 0;
}



